import threading
import yaml
import json
import datetime
import pathlib
import time
import shutil
import subprocess
import os
import sys
import re
import requests
import psutil
import ctypes
import typing
import configparser
import zipfile
import sqlite3
import random
import logging
import cv2
import base64
import io
import PIL.Image
import uiautomation


from PySide6.QtWidgets import (QWidget, QMainWindow, QDialog, QFileDialog, QMessageBox, QPushButton, QListView, QListWidget,
                               QListWidgetItem, QLineEdit, QTextEdit, QLabel, QHeaderView, QInputDialog, QApplication, QProgressBar, QComboBox, QTableWidget, QTableWidgetItem, QTableView,
                               QHBoxLayout,QVBoxLayout,QLayout)

from PySide6.QtCore import (Qt, QCoreApplication, QObject, QMetaObject,
                            Signal, Slot,
                            QDateTime,
                            QThread, QThreadPool, QTimer,QRunnable,
                            QTemporaryFile, QTemporaryDir,
                            QJsonArray, QJsonDocument, QJsonParseError, QJsonValue,
                            QFile, QFileDevice, QIODevice, QIODeviceBase, QFileInfo,
                            QTextStream, QStringListModel, QModelIndex,
                            Property)  # 导入PySide6的Property装饰器


class CustomPropertyClass(QObject):
    """
    混合使用两种属性实现方式的示例类：
    1. Python原生@property + Qt信号
    2. PySide6的@Property装饰器（Qt元对象属性）
    """
    
    # ------------------------------
    # 定义信号
    # ------------------------------
    # 用于Python原生属性的信号
    value_changed = Signal(int)
    # 用于PySide6 Property的信号（按惯例命名）
    text_property_changed = Signal(str)
    
    
    def __init__(self):
        # 必须调用父类QObject的构造函数，否则信号机制无法工作
        super().__init__()
        
        # ------------------------------
        # 私有变量存储属性值
        # ------------------------------
        # 用于Python原生属性的变量
        self._value = 0  # 初始化为整数0，等价于int(0)
        # 用于PySide6 Property的变量
        self._text = ""  # 初始化为空字符串，等价于str()
        
        
    # ------------------------------
    # 方式一：Python原生@property + Qt信号
    # 特点：保留Python语法习惯，手动发射信号
    # ------------------------------
    @property
    def value(self) -> int:
        """
        Python原生属性的getter方法
        返回存储在私有变量_value中的整数值
        """
        return self._value
    
    @value.setter
    def value(self, new_value: int) -> None:
        """
        Python原生属性的setter方法
        包含类型检查和信号发射逻辑
        """
        # 类型检查：确保输入是整数
        if not isinstance(new_value, int):
            raise TypeError("value属性必须是整数类型")
        
        # 只有当值真正改变时才更新并发射信号
        if self._value != new_value:
            self._value = new_value
            # 手动发射信号，通知所有连接的槽函数
            self.value_changed.emit(new_value)
    
    
    # ------------------------------
    # 方式二：PySide6的@Property装饰器（对应Qt的Q_PROPERTY）
    # 特点：集成Qt元对象系统，支持QML、Qt Designer等
    # ------------------------------
    @Property(str, notify=text_property_changed)
    def text_property(self) -> str:
        """
        PySide6 Property的getter方法
        通过notify参数关联信号text_property_changed
        """
        return self._text
    
    @text_property.setter
    def text_property(self, new_text: str) -> None:
        """
        PySide6 Property的setter方法
        当值改变时发射关联的信号
        """
        # 类型检查：确保输入是字符串
        if not isinstance(new_text, str):
            raise TypeError("text_property属性必须是字符串类型")
        
        # 只有当值真正改变时才更新并发射信号
        if self._text != new_text:
            self._text = new_text
            # 发射信号，通知所有连接的槽函数
            self.text_property_changed.emit(new_text)


# ------------------------------
# 使用示例
# ------------------------------
if __name__ == "__main__":
    # 创建Qt应用实例
    app = QApplication(sys.argv)
    
    # 实例化自定义属性类
    custom_obj = CustomPropertyClass()
    
    # 连接信号与槽函数，测试两种属性
    def on_value_changed(new_value):
        print(f"Python原生属性value更新为: {new_value}")
    
    def on_text_changed(new_text):
        print(f"PySide6 Property属性text_property更新为: {new_text}")
    
    custom_obj.value_changed.connect(on_value_changed)
    custom_obj.text_property_changed.connect(on_text_changed)
    
    # 测试Python原生属性
    custom_obj.value = 10  # 会触发value_changed信号
    custom_obj.value = 20  # 会触发value_changed信号
    
    # 测试PySide6 Property属性
    custom_obj.text_property = "Hello"  # 会触发text_property_changed信号
    custom_obj.text_property = "Qt Property"  # 会触发text_property_changed信号
    
    # 启动应用事件循环
    sys.exit(app.exec())
